from django.db import models

# Create your models here.

# 测试一下 定义一个学生类 类名的首字母要大写 如果不大写就会出现一个警告 这个警告不是报错可以改也可以不改
# 让它继承模型成为一个模型类 模型是一个类 类里面的数据是一个对象 对象就是类通过实例化出来的
class Student(models.Model):
    # 数值从哪里来 定义一个元组
    SEX_CHOICES = (
        (0, '女'),
        (1, '男')
    )

    # 创建字段  定义字段的名字

    # 名字字段名 选择字段类型为字符串类型
    # verbose_name='' 主要是给admin和测试网站去查看用的 它会自动生成显示字段的内容 也就是中文提示
    # 如果你能看懂英文的话可以不用定义这个verbose_name=''
    name = models.CharField(max_length=30, verbose_name='姓名')
    # 年龄字段名用整型 给它添加约束: null=True 字段的值可以为空    blank=True 前端可以不传值给到后端
    age = models.IntegerField(verbose_name='年龄', null=True, blank=True)
    # 性别字段名用整数类型   null=True, blank=True是一个组合   choices字段的值是添加数值的选项 在admin后台会变成下拉框
    sex = models.IntegerField(verbose_name='性别', null=True, blank=True, choices=SEX_CHOICES)
    # 创建时间字段名用日期类型     auto_now_add=True 自动添加当前的时间 不可以去更改的   verbose_name='' 字段名中文提示
    creat_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
    # 修改时间 更新时间字段名用日期类型  auto_now=True 可以修改的当前时间
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    # 是否删除字段名用布尔类型  默认值是False
    # verbose_name="逻辑删除" 就是当我们添加一个用户的时候 这里是一个学生 当他需要注销掉自己的账号的时候 并没有真正把他从我们的数据库里面删掉
    # 只是把它藏起来了 它还是存在在我们的数据库里面 并不会显示给用户看 所以默认值为False
    # 当用户做了删除的操作的时候 我们就把它的默认值修改为default=True 就会把这条数据隐藏
    # 当我们要找回这条数据的时候 就把这个默认的值改为default=False 这个用户就会显示出来
    is_delete = models.BooleanField(default=False, verbose_name="逻辑删除")
    # 班级字段名用外键类型 因为一个班级可以有多名学生 需要一对多    null=True 设置班级的值可以为空
    classes = models.ForeignKey('Classes',on_delete=models.SET_NULL,null=True)

    # 重新定义一个删除的方法
    def delete(self, using=None, keep_parents=False):
        # 重写删除的方法 把逻辑删除的值修改为True
        # 在学生视图集类 的查询方list方法里面获取学生对象时 student = Student.objects.filter(is_delete=False)
        # 也就是说当你把逻辑删除的值设置为真的时候 我查就会过滤掉这条数据 就不会显示出来给你看
        # 你就会认为我已经把这条数据删除掉了 其实我并没有把这条数据删掉 我只是把它隐藏起来了
        self.is_delete = True
        self.save()

# 定义一个班级的Classes类 让它继承模型成为一个模型类
class Classes(models.Model):
    name = models.CharField(max_length=30, verbose_name='班级名')
    # 定义一个班级的口号的字段名  用文本类型  null=True 不用定义文本的长度 它的值可以为空   blank=True 前端可以不传值给到后端
    slogan = models.TextField(null=True, blank=True, verbose_name='口号')
    creat_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    is_delete = models.BooleanField(default=False, verbose_name="逻辑删除")


